package com.huanzhidadi.hystrix.feign.consumer.util;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 获取nacos实例列表并缓存起来
 */
@Component
public class ServiceInstanceCache {

    @Autowired
    private DiscoveryClient discoveryClient;

    private Cache<String, List<ServiceInstance>> cache;

    public ServiceInstanceCache() {
        cache = Caffeine.newBuilder()
                // 设置缓存的有效期为1分钟
                .expireAfterWrite(1, TimeUnit.MINUTES)
                .build();
    }

    public List<ServiceInstance> getInstances(String serviceName) {
        // 首先检查缓存中是否存在serviceName对应的值；
        // 如果存在，则直接返回缓存中的值；
        // 如果不存在，则通过discoveryClient从Nacos注册中心获取服务实例列表，并将列表存入缓存中，并返回该列表。
        // 使用这种方式，可以避免频繁地从Nacos注册中心获取服务实例列表，而是将其缓存在本地，提高了性能并减轻了对Nacos注册中心的压力
        return cache.get(serviceName, key -> {
            // 从Nacos获取服务实例列表
            List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
            return instances;
        });
    }
}
